home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / utility / utilfile / xpksourc.lha / xpk_Source / examples / xsum2.c < prev   
C/C++ Source or Header  |  1996-10-19  |  1KB  |  66 lines

  1. /* XSum2.c - sums up all bytes in a compressed or uncompressed file
  2.  *           without reading the whole file at once into mem
  3.  *
  4.  * This is a typical read-and-process xpk application. Try it out... XSum a
  5.  * file, then compress it and XSum it again. The result should be the same.
  6.  */
  7.  
  8. #include <proto/exec.h>
  9. #include <proto/dos.h>
  10. #include <proto/xpk.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. struct Library *XpkBase = NULL;
  16.  
  17. char errbuf[XPKERRMSGSIZE + 1];
  18. UBYTE *outbuf = NULL;
  19. long outbuflen;
  20.  
  21. void 
  22. end (char *text)
  23. {
  24.   if (outbuf)
  25.     FreeMem (outbuf, outbuflen);
  26.   if (text)
  27.     Write (Output (), text, strlen (text));
  28.   if (XpkBase)
  29.     CloseLibrary (XpkBase);
  30.   exit (text ? 10 : 0);
  31. }
  32.  
  33. void 
  34. main (int argc, char *argv[])
  35. {
  36.   XFH *xfh;
  37.   LONG len, sum = 0;
  38.   UBYTE *ptr, *last;
  39.  
  40.   if (argc != 2)
  41.     end ("Usage: xSum <filename>\n");
  42.  
  43.   if (!(XpkBase = OpenLibrary (XPKNAME, 0)))
  44.     end ("Cannot open " XPKNAME "\n");
  45.  
  46.   if (XpkOpenTags (&xfh, XPK_InName, argv[1], XPK_PassThru, TRUE, TAG_DONE))
  47.     end (strcat (errbuf, "\n"));
  48.  
  49.   if (!(outbuf = (UBYTE *) AllocMem (outbuflen = xfh->NLen + XPK_MARGIN, 0)))
  50.     end ("Out of memory\n");
  51.  
  52.   while ((len = XpkRead (xfh, outbuf, XPKLEN_ONECHUNK)) > 0) {
  53.     ptr = (UBYTE *) outbuf;
  54.     last = ptr + len;
  55.     while (ptr < last)
  56.       sum += *ptr++;
  57.   }
  58.  
  59.   if (XpkClose (xfh) || len)
  60.     end (strcat (errbuf, "\n"));
  61.  
  62.   printf ("%d\n", sum);
  63.  
  64.   end (NULL);
  65. }
  66.